package it.traveldream.beans;

import it.traveldream.entities.Alloggio;
import it.traveldream.entities.Componente;
import it.traveldream.entities.ComponenteNuovoTipoTrasporto;
import it.traveldream.entities.Escursione;
import it.traveldream.entities.Group;
import it.traveldream.entities.NuovoTipoTrasporto;
import it.traveldream.entities.Pacchetto;
import it.traveldream.entities.ProdottoAcquistabile;
import it.traveldream.entities.Trasporto;
import it.traveldream.entities.User;
import it.traveldream.entities.Volo;
import it.traveldreamClient.beans.ComponentiMgrBeanInterface;
import it.traveldreamClient.beans.dto.AlloggioDTO;
import it.traveldreamClient.beans.dto.ComponenteDTO;
import it.traveldreamClient.beans.dto.ComponenteNuovoTipoTrasportoDTO;
import it.traveldreamClient.beans.dto.EscursioneDTO;
import it.traveldreamClient.beans.dto.NuovoTipoTrasportoDTO;
import it.traveldreamClient.beans.dto.PkgDTO;
import it.traveldreamClient.beans.dto.ProdottoAcquistabileDTO;
import it.traveldreamClient.beans.dto.TrasportoDTO;
import it.traveldreamClient.beans.dto.VoloDTO;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

import javax.annotation.Resource;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJBContext;
import javax.ejb.Local;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.TypedQuery;

/**
 * Session Bean implementation class ComponentiMgrBean
 */
@Stateless
public class ComponentiMgrBean implements ComponentiMgrBeanInterface {

	@PersistenceContext 
	private EntityManager em;
	
	@Resource
	private EJBContext context;

    /**
     * Default constructor. 
     */
    public ComponentiMgrBean() {
        // TODO Auto-generated constructor stub
    }

	/**
     * @see ComponentiMgrBeanInterface#updateAlloggio(AlloggioDTO)
     */
    public void updateAlloggio(AlloggioDTO Alloggio) {
        // TODO Auto-generated method stub
    }

	/**
     * @see ComponentiMgrBeanInterface#saveVolo(VoloDTO)
     */
    public void saveVolo(VoloDTO Volo) {
        // TODO Auto-generated method stub
    	Volo vo=new Volo(Volo);
    	em.persist(vo);
    }

	/**
     * @see ComponentiMgrBeanInterface#updateEscursione(EscursioneDTO)
     */
    public void updateEscursione(EscursioneDTO Escursione) {
        // TODO Auto-generated method stub
    }
    
    public List<NuovoTipoTrasportoDTO> getTipi(){
    	List<NuovoTipoTrasporto> lista=em.createQuery("Select e from NuovoTipoTrasporto e").getResultList();
    	List<NuovoTipoTrasportoDTO> listaDTO=new ArrayList<NuovoTipoTrasportoDTO>();
    	for(NuovoTipoTrasporto t : lista){
    		listaDTO.add(t.getDTO());
    	}
    	
    	return listaDTO;
    }

	/**
     * @see ComponentiMgrBeanInterface#getAlloggioDTO()
     */
    public AlloggioDTO getAlloggioDTO() {
        // TODO Auto-generated method stub
			return null;
    }

	/**
     * @see ComponentiMgrBeanInterface#updateVolo(VoloDTO)
     */
    public void updateVolo(VoloDTO Escursione) {
        // TODO Auto-generated method stub
    }

	/**
     * @see ComponentiMgrBeanInterface#getVoloDTO()
     */
    public VoloDTO getVoloDTO() {
        // TODO Auto-generated method stub
			return null;
    }

	/**
     * @see ComponentiMgrBeanInterface#getEscursioneDTO()
     */
    public EscursioneDTO getEscursioneDTO() {
        // TODO Auto-generated method stub
			return null;
    }
    
    public void saveEscursione(EscursioneDTO Escursione) {
        // TODO Auto-generated method stub
     	Escursione Es = new Escursione(Escursione);
    		em.persist(Es);
    }
    
    /**
     * @see ComponentiMgrBeanInterface#saveAlloggio(AlloggioDTO)
     */
    public void saveAlloggio(AlloggioDTO Alloggio) {
    	Alloggio Al = new Alloggio(Alloggio);
		em.persist(Al);
    }

    
    
	/**
     * @see ComponentiMgrBeanInterface#deleteComponente(String)
     */
    public void deleteComponente(String id) {
    	Componente uno = em.find(Componente.class, id);
    	if(uno==null){
        	uno = em.find(Trasporto.class, id);
    	}
		uno.setDisponibilita(false);
		em.merge(uno);		
	}

	public List<TrasportoDTO> getAllTrasporti() {
		List<TrasportoDTO> p;
		p = new ArrayList<TrasportoDTO>();
		Query query = em.createQuery("SELECT e FROM Trasporto e where e.Disponibilita = true");	

	    List<Trasporto> resultList= (List<Trasporto>) query.getResultList();

		for(Trasporto v: resultList){
			
			if(v instanceof ComponenteNuovoTipoTrasporto){
				ComponenteNuovoTipoTrasportoDTO dto=new ComponenteNuovoTipoTrasportoDTO();
				ComponenteNuovoTipoTrasporto c=(ComponenteNuovoTipoTrasporto) v;
				NuovoTipoTrasportoDTO tipo=getTipo(c.getTipo());
				dto=(ComponenteNuovoTipoTrasportoDTO) c.getDTO();
				dto.setTipoDTO(tipo);
				p.add(dto);
			}else {
				p.add(v.getDTO());
			}
			
		}
		return p;
	}
	
	
	
	public List<EscursioneDTO> getAllEscursioni() {
		ArrayList<EscursioneDTO> p;
		p = new ArrayList<EscursioneDTO>();
	
		
		TypedQuery<Escursione> query = em.createQuery("SELECT a FROM Escursione a where a.Disponibilita = true", Escursione.class);
		List<Escursione> resultList = query.getResultList();
		
		for(Escursione v: resultList)
			p.add(v.getDTO());
		return p;
	}
	
	public List<AlloggioDTO> getAllAlloggi() {
		ArrayList<AlloggioDTO> p;
		p = new ArrayList<AlloggioDTO>();
	
		
		TypedQuery<Alloggio> query = em.createQuery("SELECT a FROM Alloggio a where a.Disponibilita = true", Alloggio.class);
		List<Alloggio> resultList = query.getResultList();
		
		for(Alloggio v: resultList)
			p.add(v.getDTO());
		return p;
	}

	@Override
	public NuovoTipoTrasportoDTO getTipo(String tipostr) {
		return  em.find(NuovoTipoTrasporto.class, tipostr).getDTO();
	}

	@Override
	public void saveComponenteNuovoTipo(ComponenteNuovoTipoTrasportoDTO tntDTO) {
		ComponenteNuovoTipoTrasporto tnt=new ComponenteNuovoTipoTrasporto(tntDTO);
    	em.persist(tnt);
		
	}
	
/*
	public Componente find(String id) {
    	return em.find(Componente.class, id);
    }
	
	public ComponenteDTO ge(String idcmp) {
		System.out.println(idcmp);
		
		Componente j= find(idcmp);
		
		return j.getDTO();
	}*/
}
  


